import pandas as pd
from datetime import datetime, timedelta
import os

from models import db, RepairRecord, Product, Organization

def export_overtime_repairs():
    """统计超时维修记录并写入Excel"""
    
    now = datetime.now()
    # 查询状态为待响应或维修中的记录
    records = db.session.query(RepairRecord).filter(
        RepairRecord.repair_status.in_(["待响应", "维修中"]),
        RepairRecord.is_active == True
    ).order_by(RepairRecord.report_date).all()
    
    # 筛选出报修时间到当前时间超过70小时的记录
    overtime_records = [
        r for r in records 
        if (now - r.report_date).total_seconds() > 70*3600
    ]
    
    # 整理数据
    data = []
    for r in overtime_records:
        duration_hours = (now - r.report_date).total_seconds() / 3600
        data.append({
            '产品名称': r.product_name,
            '所属机构': r.org_shortname_c,
            '所属科室': r.department_name,
            '报修时间': r.report_date.strftime('%Y-%m-%d %H:%M:%S') if r.report_date else '',
            '故障描述': r.fault_description,
            '维修状态': r.repair_status,
            '故障小时': f"{duration_hours:.1f}",
        })
    
    df = pd.DataFrame(data)
    import os
    out_path = os.path.join(os.path.dirname(__file__), "modules", "statistic", "xlsx2", "超时维修记录.xlsx")
    print(f"即将将{len(overtime_records)}条超时维修记录写入Excel文件：{out_path}")
    df.to_excel(out_path, index=False)
    print(f"已将{len(overtime_records)}条超时维修记录写入Excel文件：{out_path}")

def export_dept_price_by_org():
    """导出各机构的科室和金额区间统计"""
    from models import Product, Organization
    
    # 定义价格区间（价格单位为万元）
    price_ranges = [
        (0, 1, '0-1万'),
        (1, 5, '1-5万'), 
        (5, 10, '5-10万'),
        (10, 50, '10-50万'),
        (50, 100, '50-100万'),
        (100, float('inf'), '100万以上')
    ]
    
    # 获取所有机构
    organizations = Organization.query.all()
    
    for org in organizations:
        try:
            # 查询该机构的所有产品
            products = Product.query.filter_by(
                org_short_name_c=org.short_name_c,
                
                is_active=1  # 添加is_active条件
            ).all()
            
            if not products:
                print(f"机构 {org.short_name_c} 没有找到设备数据")
                continue
            
            # 统计各科室的数据
            dept_stats = {}
            
            for product in products:
                dept_name = product.department_name or '未分类'
                price = product.price or 0  # 价格单位为万元
                quantity = product.quantity or 1
                total_amount = product.total_amount or (price * quantity)  # 总金额也是万元
                
                if dept_name not in dept_stats:
                    dept_stats[dept_name] = {
                        '科室': dept_name,
                        '0-1万_台数': 0, '0-1万_金额': 0,
                        '1-5万_台数': 0, '1-5万_金额': 0,
                        '5-10万_台数': 0, '5-10万_金额': 0,
                        '10-50万_台数': 0, '10-50万_金额': 0,
                        '50-100万_台数': 0, '50-100万_金额': 0,
                        '100万以上_台数': 0, '100万以上_金额': 0,
                        '设备合计台数': 0,  # 新增：设备总台数
                        '设备合计金额': 0   # 新增：设备总金额
                    }
                
                # 累加设备总数和总金额
                dept_stats[dept_name]['设备合计台数'] += quantity
                dept_stats[dept_name]['设备合计金额'] += total_amount
                
                # 根据价格区间统计（价格单位为万元）
                for i, (min_price, max_price, range_name) in enumerate(price_ranges):
                    # 对于最后一个区间（100万以上），特殊处理
                    if i == len(price_ranges) - 1:
                        if price >= min_price:
                            dept_stats[dept_name][f'{range_name}_台数'] += quantity
                            dept_stats[dept_name][f'{range_name}_金额'] += total_amount
                            break
                    # 对于其他区间，使用半开半闭区间 [min_price, max_price)
                    elif min_price <= price < max_price:
                        dept_stats[dept_name][f'{range_name}_台数'] += quantity
                        dept_stats[dept_name][f'{range_name}_金额'] += total_amount
                        break
            
            # 转换为DataFrame
            df_data = list(dept_stats.values())
            current_date = datetime.today().strftime('%Y-%m-%d')

            for row in df_data:
                row['日期'] = current_date
            
            # 计算合计行
            if df_data:  # 确保 df_data 不为空，避免 sum 对空列表操作可能引发的问题
                total_row = {
                    '科室': '合计',
                    '0-1万_台数': sum(row.get('0-1万_台数', 0) for row in df_data),
                    '0-1万_金额': sum(row.get('0-1万_金额', 0) for row in df_data),
                    '1-5万_台数': sum(row.get('1-5万_台数', 0) for row in df_data),
                    '1-5万_金额': sum(row.get('1-5万_金额', 0) for row in df_data),
                    '5-10万_台数': sum(row.get('5-10万_台数', 0) for row in df_data),
                    '5-10万_金额': sum(row.get('5-10万_金额', 0) for row in df_data),
                    '10-50万_台数': sum(row.get('10-50万_台数', 0) for row in df_data),
                    '10-50万_金额': sum(row.get('10-50万_金额', 0) for row in df_data),
                    '50-100万_台数': sum(row.get('50-100万_台数', 0) for row in df_data),
                    '50-100万_金额': sum(row.get('50-100万_金额', 0) for row in df_data),
                    '100万以上_台数': sum(row.get('100万以上_台数', 0) for row in df_data),
                    '100万以上_金额': sum(row.get('100万以上_金额', 0) for row in df_data),
                    '设备合计台数': sum(row.get('设备合计台数', 0) for row in df_data), 
                    '设备合计金额': sum(row.get('设备合计金额', 0) for row in df_data)
                }
                total_row['日期'] = current_date
                df_data.append(total_row)
            else: # 如果 df_data 为空，也生成一个空的合计行，或者根据需求处理
                total_row = {
                    '科室': '合计',
                    '0-1万_台数': 0,
                    '0-1万_金额': 0,
                    '1-5万_台数': 0,
                    '1-5万_金额': 0,
                    '5-10万_台数': 0,
                    '5-10万_金额': 0,
                    '10-50万_台数': 0,
                    '10-50万_金额': 0,
                    '50-100万_台数': 0,
                    '50-100万_金额': 0,
                    '100万以上_台数': 0,
                    '100万以上_金额': 0,
                    '设备合计台数': 0, 
                    '设备合计金额': 0,
                    '日期': current_date
                }
                df_data.append(total_row)

            # --- 文件操作逻辑移到这里 ---
            # 确保目录存在
            output_dir = os.path.join(os.path.dirname(__file__), "modules", "statistic", "xlsx3")
            os.makedirs(output_dir, exist_ok=True)
            
            # 生成文件名
            filename = f"{org.short_name_c}_科室和金额区间统计.xlsx"
            output_path = os.path.join(output_dir, filename)

            final_df = pd.DataFrame(df_data)

            if os.path.exists(output_path):
                try:
                    old_df = pd.read_excel(output_path, sheet_name="科室和金额区间统计")
                    # 确保日期列是字符串以便比较
                    old_df['日期'] = old_df['日期'].astype(str)
                    final_df['日期'] = final_df['日期'].astype(str)
                    # 删除当前日期的旧数据
                    old_df = old_df[old_df['日期'] != current_date]
                    # 合并新旧数据
                    final_df = pd.concat([old_df, final_df], ignore_index=True)
                except Exception as e:
                    print(f"读取或合并Excel文件 {output_path} 时出错: {e}")
            
            # 保存Excel文件
            try:
                with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
                    final_df.to_excel(writer, sheet_name='科室和金额区间统计', index=False)
                print(f"成功生成机构 {org.short_name_c} 的统计文件: {output_path}")
            except Exception as e:
                print(f"保存Excel文件 {output_path} 时出错: {e}")
            
            print(f"已生成 {org.short_name_c} 的统计文件：{output_path}")
            print(f"  - 共统计 {len(df_data)-1} 个科室")  # 减1是因为包含了合计行
            print(f"  - 共统计 {len(products)} 台设备")
            
        except Exception as e:
            print(f"处理机构 {org.short_name_c} 时出错：{str(e)}")
            continue
    
    print("所有机构的科室和金额区间统计文件生成完成！")

if __name__ == '__main__':
    from app import dash_app

    with dash_app.server.app_context():
        export_overtime_repairs()
        export_dept_price_by_org()